# 嵌套依赖项可以使用 yield 来管理多个依赖的生命周期。使用 yield 的嵌套依赖将确保在请求处理开始和结束时，按照正确的顺序执行和清理各个依赖。

# 当请求到达 /users/me 路径时：
# 首先调用 get_current_user，内部依赖 get_db。
# 调用 get_db 创建数据库会话，执行 yield db。
# 然后，get_current_user 执行 yield user，交出用户信息。
# 最后，read_users_me 使用该用户信息进行响应。

# 当请求结束后：
# 首先执行 get_current_user 的 finally 块，打印 "Cleaning up user resources"。
# 然后执行 get_db 的 finally 块，关闭数据库会话。

from fastapi import FastAPI, Depends
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, Session

# 创建 FastAPI 实例
app = FastAPI()

# 数据库连接配置，启用连接池
DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL, pool_size=5, max_overflow=10)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)


# 依赖项：数据库会话
def get_db() -> Session:
    db = SessionLocal()
    try:
        yield db  # 交出会话以供使用
    finally:
        print("关闭数据库会话")
        db.close()  # 关闭会话


# 依赖项：获取当前用户
def get_current_user(db: Session = Depends(get_db)):
    # 模拟用户获取逻辑
    user = {"user_id": 1, "username": "example_user"}
    try:
        yield user  # 交出用户信息以供使用
    finally:
        print("清理用户相关资源")  # 清理用户相关资源


# 主路径操作，嵌套依赖
@app.get("/users/me")
async def read_users_me(user: dict = Depends(get_current_user)):
    return {"user_id": user["user_id"], "username": user["username"]}


